package org.boot.easyapi.util;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.*;
import java.util.stream.Collectors;

public class CollUtil {

    private static final ObjectMapper MAPPER = new ObjectMapper();


    /**
     * 判断集合是否为空
     *
     * @param collection 集合
     * @return 如果集合为null或集合大小为0，则返回true，否则返回false
     */
    public static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * 判断集合是否不为空
     *
     * @param collection 集合
     * @return 如果集合不为null且集合大小大于0，则返回true，否则返回false
     */
    public static boolean isNotEmpty(Collection<?> collection) {
        return !isEmpty(collection);
    }

    /**
     * 判断数组是否为空
     *
     * @param array 数组
     * @return 如果数组为null或数组长度为0，则返回true，否则返回false
     */
    public static boolean isEmpty(Object[] array) {
        return array == null || array.length == 0;
    }

    /**
     * 判断数组是否不为空
     *
     * @param array 数组
     * @return 如果数组不为null且数组长度大于0，则返回true，否则返回false
     */
    public static boolean isNotEmpty(Object[] array) {
        return !isEmpty(array);
    }

    /**
     * 判断Map是否为空
     *
     * @param map Map
     * @return 如果Map为null或Map大小为0，则返回true，否则返回false
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return map == null || map.isEmpty();
    }

    /**
     * 判断Map是否不为空
     *
     * @param map Map
     * @return 如果Map不为null且Map大小大于0，则返回true，否则返回false
     */
    public static boolean isNotEmpty(Map<?, ?> map) {
        return !isEmpty(map);
    }

    /**
     * 支持格式：
     *   [1,2,3]      -> ["1","2","3"]
     *   1,2,3        -> ["1","2","3"]
     *   ["1","2"]    -> ["1","2"]
     *
     * @param raw 前端/接口传来的任意“数组字符串”
     * @return 元素全为 String 的 List，解析失败返回空 List
     */
    public static List<String> toStrList(String raw) {
        if (raw == null || raw.isEmpty()) {
            return Collections.emptyList();
        }

        raw = raw.trim();
        try {
            /* ---------- 1. 已经是 JSON 数组形式 ---------- */
            if ((raw.startsWith("[") && raw.endsWith("]"))) {
                // Jackson 会把它反序列成 List<?>，元素可能是 Integer 或 String
                List<?> tmp = MAPPER.readValue(raw, new TypeReference<List<?>>() {});
                return tmp.stream()
                        .map(String::valueOf)
                        .collect(Collectors.toList());
            }

            /* ---------- 2. 纯逗号分隔 ---------- */
            return Arrays.stream(raw.split(","))
                    .map(String::trim)
                    .filter(s -> !s.isEmpty())
                    .collect(Collectors.toList());

        } catch (Exception e) {
            // 日志可按需记录
            return Collections.emptyList();
        }
    }

}
